package com.sangeng.service;

import com.sangeng.dao.StudentDao;
import com.sangeng.pojo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionTimedOutException;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional // 开启事务处于类中 所有方法都开启事务
public class StudentService {
    
    @Autowired
    private StudentDao studentDao;

    /**
     *
     * 添加事务：
     *      @Transactional
     *      位置：方法上 | 类上
     *      方法：当前方法有事务
     *      类：当前类中的所有方法都有事务
     * 1.只读模式（readOnly）
     *    只读模式能够提升查询事务的效率！ 推荐事务中只有查询代码时，使用只读模式
     *    默认：false （再次添加注解可以覆盖）
     * 2.超时时间（timeout）
     *    默认：-1
     *    超时时间：单位：秒
     * 3.事务异常（rollbackFor）
     *    默认：RuntimeException //运行时异常
     *    可以指定Exception
     *    rollbackFor = Exception.class //回滚异常
     *    noRollbackFor = ArithmeticException.class //不回滚异常
     * 4.隔离级别（isolation）
     *    设置事务的隔离级别,mysql默认是repeatable read!（可重复读 避免了脏读）
     * 5.事务传播行为（propagation）
     *    默认：REQUIRED 如果父方法有事务，就加入，如果没有就新建自己独立！
     *    REQUIRED：如果父方法有事务，就加入，如果没有就新建自己独立！
     */

    @Transactional(readOnly = false,timeout = 2) //
    public void changeInfo(){
        studentDao.updateSexById("女",2019);
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("-----------");
        //int i= 1/0;
        studentDao.updateNameById("赵玉姣",2021112);
    }

    @Transactional(readOnly = true)
    public void getInfo(){
        List<Student> all = studentDao.findAll();
        System.out.println(all);
    }
}